\chapter{Narzędzia}

W tym rodziale zostaną opisane narzędzia, które zostały użyte podczas implementacji projektu
\texttt{unicore-beyond}.

\section{Java}

Java \cite{java} jest jezykiem programowania wynalezionym przez Sun Microsystems, która teraz jest częścią
Oracle Corporation. Jej pierwsza wersja ujrzała światło dzienne w 1995 roku. Charakteryzuje się tym,
że kod źródłowy jest kompilowany do postaci kodu pośredniego (ang. bytecode), który to może być
uruchamiany w ramach maszyny wirtualnej Java (ang. Java Virtual Machine, w skrócie JVM) niezależnie
od architektury komputera. Język ten przez ostatnie 15 lat zyskał ogromną popularność w sektorze
korporacyjnym i nie tylko. Posiada bardzo rozbudowany zestaw bibliotek, tworzony przez ogromną
społeczność użytkowników. W 2007 roku specyfikacja oraz implementacja JVM sygnowanego przez Sun
Microsystems została wypuszczona jako Open Source na licencji GNU General Public Licence. Obecnie
aktualną specyfikacja nosi numer wersji 6. Trwają pracę nad wersją numer 7.

\section{Subversion}

Subversion \cite{svn} jest systemem kontroli wersji (ang. Version Control System, w skrócie VCS), który powstał
aby zastąpić swojego duchowego poprzednika jakim jest CVS. Jego zadaniem jest zapewnienie
bezpiecznego miejsca do składowania kodu źródłowego oraz wspomaganie pracy zespołowej nad
implementacją aplikacji. Działa na zasadzie centralnego repozytorium, w którym składowany jest
projekt. Użytkownik może ściągnąć z takiego repozytorium artefakt, nad którym chce pracować. Po
ukończeniu prac lokalnie, może dokonane zmiany przesłać do centralnego repozytorium. Subversion
zyskał duże uznanie wśród społeczności Open Source. W Internecie udostępniane są darmowe instancje
repozytoriów, z których można korzystać. Jednym z przykładów jest hosting Google Code
\cite{google-code} użyty w ramach pisania tej pracy.

\section{Ant}

Ant \cite{ant} jest narzędziem do automatyzacji procesu budowania aplikacji w Javie. Jest bardzo zbliżone do
narzędzia Make, z tą różnicą, że napisane zostało całkowicie w języku Java, a jego skrypty to pliki
XML. Dzięki takiej implementacji ominięto problem przenośności i uruchamiania procesu budowania na
różnych systemach i architekturach.

\section{Maven2}

Maven2 \cite{maven}, podobnie jak Ant, jest systemem do automatyzacji procesu budowania aplikacji w Javie, ale w
przeciwieństwie go niego definiuje bardzo restrykcyjny cykl tego procesu. Dodatkowo ułatwia
zarządzanie zależnościami aplikacji w sposób tranzytywny. Do tego celu są tworzone repozytoria, w
których są umieszczane biblioteki napisane w języku Java. Maven2 ułatwia też pisanie projektów
wielomodułowych.

\section{Eclipse}

Eclipse \cite{eclipse} jest zitegrowanym środowiskiem programistycznym (ang. Integrated Development
Environment, w skrócie IDE). Pozwala na pisanie aplikacji w Javie, od programów "Hello World!", po
przez aplikacje biurkowe w Swing, aż do aplikacji internetowych i przeznaczonych na platformy
mobilne. Głównymi zaletami tego właśnie IDE jest ogromna ilość
rozszerzeń, pozwalająca na dostosowanie funkcjonalności do własnych potrzeb, możliwość
refaktoryzacji kodu w wielu projektach oraz dokładny mechanizm podpowiadania i podświetlania kodu.
Dzięki temu aplikacje są pisane szybciej. Programista popełnia mniej błędów, ponieważ są one
pokazywane na poziomie pisania kodu (wstępna kompilacja).

\section{Jetty}

Jetty \cite{jetty} jest lekkim kontenerem serwletów zgodnym z ich specyfikacją w wersji 2.5, który
wykorzystuje się często do szybkiego rozwijania aplikacji. Pojawia się w postaci funkcjonalnych
wtyczek (np. dla Maven2), co upraszcza szybkie rozpoczęcie pracy podczas pisania aplikacji
internetowych opartych o specyfikację serwletów Java.

\section{Spring Framework}

Spring Framework \cite{spring} jest darmowym szkieletem aplikacji dla języka Java. Jego szkic architektoniczny
został po raz pierwszy zaprezentowany w książce \emph{Expert One-on-One J2EE Design and Development} pod
koniec roku 2002. Jej autorem jest Rod Johnson, który jest także twórcą samego szkieletu. 
Implementacja ukazała się w połowie roku 2003. Spring zyskał duże uznanie w środowisku programistów
Java ze względu na prostotę konfiguracji aplikacji oraz nowatorskim podejściom w jej projektowaniu.
Zastosowano w nim wzorce projektowe odwracania kontroli (ang. Inversion of Control, w skrócie IoC)
oraz wstrzykiwania zależności (ang. Dependecy Injection, w skrócie DI) \cite{fowler-ioc-di}. Dzieki takiemu podejściu
uzyskano możliwość pisania bardziej niezależnych od siebie części aplikacji oraz umożliwiono
łatwiejsze pisanie testów jednostkowych oraz integracyjnych. Na rdzeniu Spring Framework narosło
mnóstwo dodatkowych podprojektów, które umożliwiają m.in.: tworzenie aplikacji internetowych zgodnie
ze wzorcem MVC, dodanie warstwy autoryzacji, pisanie warstw dostępu do danych z pomocą wielu narzędzi
do mapowania obiektowo-relacyjnego.

Jedną z ważnych przyczyn suksesu tego narzędzia była ociężałość w pisaniu aplikacji zgodych ze
specyfikacją Enterprise JavaBeans (w skrócie EJB) w wersji 2.0, która wymuszała pisanie ogromnych
ilości deskryptorów XML. Dopiero wersja numer 3.0 podążyła śladem wytyczonym przez Spring Framework.

\section{Hibernate}

Hibernate \cite{hibernate} jest narzędziem do mapowania obiektowo-relacyjnego (ang. Object-Relation
Mapping, w skrócie ORM) dla języka Java. Podobnie jak Spring Framework wyrósło w czasie, kiedy
programiści Java borykali się z utrudnieniami, które stawiała przed nimi specyfikacja EJB 2.0. W
początkowych wersjach potrafił mapować tabele bazy danych za pomocą XML. Od wersji 3 i wprowadzenia
specyfikacji Java Persistance API (w skrócie JPA), umożliwiono mapowanie bezpośrednio na encjach za
pomocą adnotacji.

Niewątpliwą zaletą podejścia narzędzi ORM jest nałożenie warstwy abstrakcji na zasób bazy danych.
Umożliwia to szybką podmianę warstwy utrwalania informacji.

\section{GWT}

Google Web Toolkit (w skrócie GWT) \cite{gwt} jest narzędziem stworzonym przez Google, służącym do pisania
wysoko reaktywnych aplikacji internetowych. Kluczem tej technologii jest pisanie kodu interfejsu
użytkownika w języku Java, który następnie jest kompilowany do postaci wynikowej, czyli kodu
JavaScript. Dzięki temu zyskuje się moc języka silnie typowanego, jakim jest Java, wspomaganego
przez możliwości zaawansowanych IDE. GWT opiera się na paradygmacie programowania zdarzeniowego. Dzięki
temu aplikacje internetowe pisze się zupełnie jak aplikacje desktopowe z użyciem technologii Swing.
Wynikowy kod JavaScript, produkowany przez kompilator GWT, jest tworzony w kilku wersjach
uzależnionych od silnika przeglądarki WWW, w którym będzie później udostępniany. Dzięki temu kod
taki będzie zachowywał się zawsze tak samo niezależnie od tego czy użyjemy do uruchomienia aplikacji
Mozilla Firefox czy Internet Explorer.

GWT składa się z kilku części. Najważniejszą jest zbiór kontrolek, które w większości są
odpowiednikami elementów języka HTML. Dzięki temu możliwe jest łatwe tworzenie własnych kontrolek na
ich bazie. Kolejną ważną częścią jest mechanizm komunikacji z serwerem za pomocą techniki AJAX.
Podobnie jak przy projektowaniu interfejsu użytkownika, komunikację z serwerem także piszę się w
języku Java. Dzięki temu programista jest częściowo zwolniony z potrzeby znajomości języka
JavaScript i niuansów jego działania. Wszystkim zajmuje się za nas kompilator GWT.

Od wersji 2.0 GWT wprowadziło ulepszony sposób na rozwijanie aplikacji. Tak zwany tryb rozwoju (ang.
Development Mode) pozwala na kompilacje w locie kodu Java pisanego w IDE i oglądanie zmian na
bieżąco w natywnej przeglądarce WWW po odświeżeniu strony z aplikacją. Przed wersją 2.0 aplikacja
była uruchamiana w ramach dostarczanej przez GWT pseudo przeglądarki WWW. Podejście to miało
zasadniczą wadę. Strony w niej wyglądały często inaczej niż w rzeczywistości po pełnej kompilacji w
natywnych przeglądarkach zainstalowanych w systemie użytkownika.

\section{GXT}

Po sukcesie GWT wyrosło sporo narzędzi, które dostaczają dla niego bardziej wyrafinowane kontrolki.
Jednym z najbardziej interesujących jest produkt zespołu ExtJS, czyli GXT \cite{gxt}.

Biblioteka ta dostarcza bogaty zbiór widgetów, które są bardzo funkcjonalne oraz estetyczne.
Spełniają większość standardowych wymagań, które potrzebne są najczęściej podczas pisania aplikacji
biznesowych. Zbiór ten zawiera kontrolki wyspecjalizowanych pól do wprowadzania danych, wyświetlania
drzew, list oraz kilku mniej standardowych kompozycji. Każda z kontrolek ma bardzo bogaty zestaw
akcji, które programista może oprogramować oraz wspomaga walidację danych po stronie klienta,
informując użytkownika w odpowiedni sposób.

\section{Unicore}

Unicore \cite{unicore} jest systemem gridowym tworzonym w ramach współpracy kilku dużych
uniwersytetów europejskich. Dostarcza zarówno część kliencką jak i serwerową, pozwalające w sposób
przeźroczysty i bezpieczny na korzystanie z siły obliczeń rozproszonych.

Jego główne charakterystyki to:

\begin{itemize}

\item Otwartość źródeł oparta o licencję BSD.

\item Oparcie o znane i dobrze przemyślane standardy: Open Grid Services Architecture (OGSA) oraz Web Services Resource Framework (WSRF).

\item Zaprojektowany z myślą o rozszerzalności i modularności, zgodnie z architekturą zorientowaną
serwisowo (ang. Service Oriented Architecture, w skrócie SOA).

\item System zabezpieczeń oparty o certyfikaty X.509 oraz wirtualne organizacje (ang. Virtual
Organisations).

\item Wspomaganie tworzenia i uruchamiania przepływów zadań (ang. workflow).

\item Dostarczone aplikacji klienckie. Od klienta graficznego, po przez interfejs linii komend, aż
po dostęp przez WWW.

\item Możliwość uruchamiania na różnych systemach operacyjnych.

\item W całości napisany w języku Java.

\end{itemize}

\section{JSDL}

Za skrótem JSDL, kryje się nazwa Job Submission Definition Language \cite{jsdl}. Jest to dialekt języka XML,
który umożliwia opis zadania uruchamianego w systemie gridowym. Opis taki jest stosowany m.in. w
ramach systemu Unicore. Pozwala na wyszczególnienie następujących cech zadania:

\begin{itemize}

\item Nazwy i opisu zadania.

\item Opisu zasobów potrzebnych do uruchomienia i działania zadania, takich jak: ilość pamięci RAM,
czas procesora, liczba procesorów.

\item Opisu ograniczeń wykonania zadania, takich jak: maksymalny czas użycia procesora, ilość użytej
pamięci.

\item Pobierania lub wysyłania plików przed lub po wykonaniu zadania.

\item Komendy do wykonania w ramach zadania, włączając w to parametry wywołania, ustawień środowiska,
przekierowań strumieni wejścia, wyjścia oraz błędów.

\end{itemize}

\section{Simple Workflow}

Jest to dialekt XML, który skupia się na opisie diagramu przepływów (ang. workflow) zadań. Został
zaprojektowany w ramach projektu Chemomentum \cite{chemomentum}, którego jednym z zadań było
rozszerzenie funkcjonalności systemu Unicore o serwis przetwarzający zadania złożone.

Umożliwia on tworzenie grafu zadań opisanych jako JSDL. Obecnie takie przepływy można tworzyć
graficznie w ramach aplikacji Unicore Rich Client.
